// let x: any = "hello";
// let y: number;
// y = x;
// console.log(y);
// 输出的y为hello，这就是污染问题
// 这因为x：any 可以为number ，可以将'hello'赋值给 y，但是 y 明明为number，这就是污染问题

// 为了避免出现这种问题，还有一种：unknown
// let x: unknown;
// x = 1;
// x = "1";
// let z: string;
// z = x;
// 出现提示，不能将 unknown 赋值给 string

// 当一个值被赋值为 never 类型，那就永远不能解释其他赋值
// let x: never;
// x = true;

// 七种原始类型
// const x: boolean = true;
// const y: string = "1";
// const y1: String = "1";  y和y1的区别请看 5.ts
// const z: number = 1;
// const b: bigint = 312231231n;
// const c: symbol = Symbol("123");
// const d: undefined = undefined;
// const e: null = null;

// 引用类型
// const o: object = { foo: 123 };
// const o2: Object = { foo: 123 };
// const o3: Object = "123";
// Object 广义对象类型 约等于 any

// 值类型
// const a: "hello" = "hello";

// 联合声明
// const aa: number | string = "1";
// const sex: "male" | "female" = "male";  精准约束

// 创建类型
// type sextype = string | number;
// let an: sextype = "male";

// 声明数组类型
// let arr: (number | string)[] = [1, 2, 3, "4"];
// let arr2: Array<number | string> = [1, 2, 3, "4"];  泛型广泛使用，

// 元组：其实就是数组，只是有多个类型,值也要与类型一一对应
// let tuple: [number, string] = [1, "123"];

// 用interface定义一个复杂类型，定义了p就要写全，可以在类型后加？
// interface Person {
//   name: string;
//   age?: number;
//   sex?: "male" | "female";
// }
// let p: Person = { name: "张三" };
